//
//  Problem9.swift
//  LeetCode - 回文数
//
//  Created by 武侠 on 2020/7/3.
//  Copyright © 2020 zhulongiMac02. All rights reserved.
//

import UIKit

/*
判断一个整数是否是回文数。回文数是指正序（从左向右）和倒序（从右向左）读都是一样的整数。

示例 1:   输入: 121     输出: true
示例 2:   输入: -121    输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:   输入: 10      输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。

进阶:
你能不将整数转为字符串来解决这个问题吗？
*/

class Problem9: NSObject {
    func solution() {
        let nums = [121, -121, 110]
        for num in nums {
            print("result = ", num, isPalindromeHalf(num))
        }
    }
    
    // 最简单的方法, 把数字反转,然后判断是否相等
    func isPalindrome(_ x: Int) -> Bool {
        if x < 0 {
            return false
        } else if x < 10 {
            return true
        }
        var tempx = x
        var rs:Int = 0
        while tempx > 0 {
            rs = rs * 10 + tempx % 10
            tempx /= 10
        }
        return rs == x
    }
    
    // 优化1: 只反转一半的数据
    func isPalindromeHalf(_ x: Int) -> Bool {
        // 负数肯定不是, 个位数是0的肯定不是, 因为个位数是0 第一位不能是0
        if x < 0 || (x % 10 == 0 && x != 0) {
            return false
        }
        // 0 ~ 9 肯定是
        if x < 10 {
            return true
        }
        
        var tempx = x
        var rs:Int = 0
        
        // 是回文之后以下2种可能:
        // 1221     tempx = 12 rx = 12
        // 12321    tempx = 123 rx 12
        // 一旦tempx < rs 肯定不是, 是回文
        while tempx > rs {
            rs = rs * 10 + tempx % 10
            tempx /= 10
            print("rs = ", rs, tempx)
        }
        return (rs == tempx) || (tempx == rs / 10)
    }
}
